package com.atguigu.bigdata.gmall.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.bigdata.gmall.realtime.common.Constant;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @Author lzc
 * @Date 2022/10/18 15:05
 */
public class DimUtil {
    // id= "1 or 1=1"
    public static JSONObject readDimFromPhoenix(Connection conn, String table, String id) {
        // 用占位符 避免sql 注入
        String sql = "select * from " + table + " where id=?";
        
        List<JSONObject> list = JdbcUtil.queryList(conn, sql, new String[]{id}, JSONObject.class);
        // 查询的某个 id 的维度信息, 所以这个 list 集合的长度一定是 1
        // 如果 id 值插入的不对, 则这个地方会报错
        
        // create table "user"()
        
        return list.get(0);
    }
    
    public static void main(String[] args) {
        System.out.println(readDimFromPhoenix(JdbcUtil.getPhoenixConnection(), "dim_sku_info", "40"));
    }
    
    public static JSONObject readDim(Jedis jedis, Connection conn, String table, String id) {
        // redis-server /etc/redis.conf 启动 redis 的命令
        // 1. 先从 redis 读取维度
        JSONObject dim = readDimFromRedis(jedis, table, id);
        // 2.如果读到, 直接返回
        if (dim == null) {
            System.out.println("走的数据库: " + table + "  " + id);
            // 3. 如果读取不到, 则取 phoenix 读取, 再把读到的结果写入到 redis 中
            dim = readDimFromPhoenix(conn, table, id);
            writeDimToRedis(jedis, table, id, dim);
        }else{
            System.out.println("走的redis 缓存: " + table + "  " + id);
        }
        return dim;
    }
    
    /**
     * 把维度数据写入到 redis 中
     * @param jedis 客户端
     * @param table 表名
     * @param id id
     * @param dim 维度数据
     */
    public static void writeDimToRedis(Jedis jedis, String table, String id, JSONObject dim) {
        String key = getKey(table, id);
        String value = dim.toJSONString();
    
        /*jedis.set(key, value);
        // 设置 ttl
        jedis.expire(key, Constant.TWO_DAY);*/
        // 写入到 string类型, 同时设置一个 ttl
        jedis.setex(key, Constant.TWO_DAY, value);
    }
    
   
    /**
     * 从 redis 读取维度数据
     *
     * @param jedis jedis 客户端
     * @param table 读取的维度表的表名
     * @param id    读取的维度的 id
     * @return 返回 JSONObject 对象, 如果没有这条维度数据, 则返回 null
     */
    public static JSONObject readDimFromRedis(Jedis jedis, String table, String id) {
        String key = getKey(table, id);
        String jsonString = jedis.get(key);
    
        JSONObject dim = null;
        if (jsonString != null) {
            // 把jsonString 解析成一个对象
            dim = JSON.parseObject(jsonString);
        }
        return dim;
    }
    
    
    public static String getKey(String table, String id) {
        return table + ":" + id;
    }
    
}
